import pandas as pd
import os



def process_excel_files(file1_path, file2_path, output_file='update_script.sql'):
    """
    处理两个Excel文件并生成MySQL更新脚本

    Args:
        file1_path: 第一个Excel文件路径（包含desk_template字段）
        file2_path: 第二个Excel文件路径（包含id和name字段）
        output_file: 输出的SQL脚本文件名
    """

    try:
        # 读取第一个Excel文件
        print(f"正在读取第一个Excel文件: {file1_path}")
        df1 = pd.read_excel(file1_path)

        # 检查必要的列是否存在
        if 'desk_template' not in df1.columns:
            raise ValueError("第一个Excel文件中未找到 'desk_template' 列")
        if 'id' not in df1.columns:
            raise ValueError("第一个Excel文件中未找到 'id' 列")

        # 读取第二个Excel文件
        print(f"正在读取第二个Excel文件: {file2_path}")
        df2 = pd.read_excel(file2_path)

        # 检查必要的列是否存在
        if 'id' not in df2.columns:
            raise ValueError("第二个Excel文件中未找到 'id' 列")
        if 'name' not in df2.columns:
            raise ValueError("第二个Excel文件中未找到 'name' 列")

        # 创建第二个文件的id到name的映射字典
        id_to_name = dict(zip(df2['id'], df2['name']))

        # 存储生成的SQL语句
        sql_statements = []

        # 处理第一个Excel文件的每一行
        for index, row in df1.iterrows():
            desk_template = str(row['desk_template']).strip()
            record_id = row['id']

            # 跳过空值或NaN
            if pd.isna(desk_template) or desk_template == 'nan' or desk_template == '':
                continue

            # 按英文逗号分隔desk_template
            template_ids = [item.strip() for item in desk_template.split(',')]

            # 过滤长度为1的项目
            single_char_ids = [item for item in template_ids if len(item) == 1]

            if len(template_ids)!=1:
                continue

            # 查找匹配的name值
            matched_names = []
            for template_id in template_ids:
                # 尝试将字符串转换为数字进行匹配
                try:
                    numeric_id = int(template_id)
                    if numeric_id in id_to_name:
                        matched_names.append(id_to_name[numeric_id])
                except ValueError:
                    # 如果无法转换为数字，直接用字符串匹配
                    if template_id in id_to_name:
                        matched_names.append(id_to_name[template_id])

            # 生成SQL更新语句
            for name in matched_names:
                # 转义单引号以防SQL注入
                escaped_name = name.replace("'", "''")
                sql = f"UPDATE diagnostic_template_plan SET `name` = '{escaped_name}' WHERE id = {record_id};"
                sql_statements.append(sql)

        # 写入SQL文件
        if sql_statements:
            with open(output_file, 'w', encoding='utf-8') as f:
                f.write("-- MySQL更新脚本\n")
                f.write(f"-- 生成时间: {pd.Timestamp.now()}\n")
                f.write("-- 注意：执行前请备份数据库\n\n")

                for sql in sql_statements:
                    f.write(sql + '\n')

            print(f"成功生成 {len(sql_statements)} 条SQL更新语句")
            print(f"SQL脚本已保存到: {output_file}")
        else:
            print("没有找到符合条件的数据，未生成SQL脚本")

    except FileNotFoundError as e:
        print(f"文件未找到: {e}")
    except Exception as e:
        print(f"处理过程中发生错误: {e}")


def main():
    """
    主函数 - 设置文件路径并调用处理函数
    """
    # 设置Excel文件路径
    file1_path = "D:\\project_file\\诊断式学习\\生产现有合成计划模板数据0627\\2025-06-27-15-37-23_EXPORT_XLSX_19937559_141_0.xlsx"  # 第一个Excel文件路径
    file2_path = "D:\\project_file\\诊断式学习\\最新完整生产模板计划\\生产模板计划062615点完整.xlsx"  # 第二个Excel文件路径
    output_file = "update_script.sql"  # 输出的SQL脚本文件

    # 检查文件是否存在
    if not os.path.exists(file1_path):
        print(f"错误: 文件 {file1_path} 不存在")
        print("请将第一个Excel文件重命名为 'file1.xlsx' 并放在脚本同一目录下")
        return

    if not os.path.exists(file2_path):
        print(f"错误: 文件 {file2_path} 不存在")
        print("请将第二个Excel文件重命名为 'file2.xlsx' 并放在脚本同一目录下")
        return

    # 处理文件
    process_excel_files(file1_path, file2_path, output_file)


if __name__ == "__main__":
    # 安装必要的依赖包提示
    print("请确保已安装必要的Python包:")
    print("pip install pandas openpyxl")
    print("-" * 50)

    main()